package com.jiesen.resource.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import com.aliyun.oss.OSSClient;

public class TypeDict {
    /**
     * 常用文件的文件头如下：(以前六位为准)
     * JPEG (jpg)，文件头：FFD8FF
     * PNG (png)，文件头：89504E47
     * GIF (gif)，文件头：47494638
     * TIFF (tif)，文件头：49492A00
     * Windows Bitmap (bmp)，文件头：424D
     * CAD (dwg)，文件头：41433130
     * Adobe Photoshop (psd)，文件头：38425053
     * Rich Text Format (rtf)，文件头：7B5C727466
     * XML (xml)，文件头：3C3F786D6C
     * HTML (html)，文件头：68746D6C3E
     * Email [thorough only] (eml)，文件头：44656C69766572792D646174653A
     * Outlook Express (dbx)，文件头：CFAD12FEC5FD746F
     * Outlook (pst)，文件头：2142444E
     * MS Word/Excel (xls.or.doc)，文件头：D0CF11E0
     * MS Access (mdb)，文件头：5374616E64617264204A
     * WordPerfect (wpd)，文件头：FF575043
     * Postscript (eps.or.ps)，文件头：252150532D41646F6265
     * Adobe Acrobat (pdf)，文件头：255044462D312E
     * Quicken (qdf)，文件头：AC9EBD8F
     * Windows Password (pwl)，文件头：E3828596
     * ZIP Archive (zip)，文件头：504B0304
     * RAR Archive (rar)，文件头：52617221
     * Wave (wav)，文件头：57415645
     * AVI (avi)，文件头：41564920
     * Real Audio (ram)，文件头：2E7261FD
     * Real Media (rm)，文件头：2E524D46
     * MPEG (mpg)，文件头：000001BA
     * MPEG (mpg)，文件头：000001B3
     * Quicktime (mov)，文件头：6D6F6F76
     * Windows Media (asf)，文件头：3026B2758E66CF11
     * MIDI (mid)，文件头：4D546864
     */

    public static boolean fileType(String url) {
        FileInputStream is;
        try {
            is = new FileInputStream(url);
            boolean typeByStream = getTypeByStream(is);
            return typeByStream;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return false;


    }

    public static boolean ossfileType(String url) {
        OSSClient ossClient = OSSUtil.getOSSClient();
        InputStream is;
        try {
            is = OSSUtil.getInputStreamByOSS(ossClient, "orhon-smartcloud", url);
            boolean typeByStream = getTypeByStream(is);
            return typeByStream;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;


    }

    /**
     * 根据文件流读取图片文件真实类型
     *
     * @param is
     * @return
     */
    public static boolean getTypeByStream(InputStream is) {
        byte[] b = new byte[4];
        try {
            is.read(b, 0, b.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String type = bytesToHexString(b).toUpperCase().substring(0, 6);

        if (type.contains("FFD8FF")) {
            return true;
        } else if (type.contains("89504E")) {
            return true;
        } else if (type.contains("474946")) {
            return true;
        } else if (type.contains("49492A")) {
            return true;
        } else if (type.contains("424D")) {
            return true;
        }
        return false;
    }

    /**
     * 根据文件流读取图片文件真实类型
     *
     * @param is
     * @return
     */
    public static String getTypeByStream1(FileInputStream is) {
        byte[] b = new byte[4];
        try {
            is.read(b, 0, b.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String type = bytesToHexString(b).toUpperCase().substring(0, 6);

        if (type.contains("FFD8FF")) {//图片
            return "images";
        } else if (type.contains("89504E")) {//图片
            return "images";
        } else if (type.contains("474946")) {//图片
            return "images";
        } else if (type.contains("49492A")) {//图片
            return "images";
        } else if (type.contains("424D")) {  //图片
            return "images";
        } else if (type.contains("504B03")) {//zip 压缩文件
            return "zips";
        } else if (type.contains("415649")) {//avi 视频
            return "video";
        } else if (type.contains("574156")) {//wav 视频
            return "video";
        } else if (type.contains("6D6F6F")) {//mov 视频
            return "video";
        } else if (type.contains("2E7261")) {//ram 音频
            return "music";
        } else if (type.contains("2E524D")) {//ram 音频
            return "music";
        }

        return "all";
    }

    /**
     * byte数组转换成16进制字符串
     *
     * @param src
     * @return
     */
    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

}